﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;

namespace Infinity.Expressions
{
	/// <summary>
	/// Az Expression Tree verifikációs kifejezése. Ő fogja ellenőrizni az elő- és utófeltételt.
	/// </summary>
	public class DebugExpression : Expression
	{
		/// <summary>
		/// Előfeltétel
		/// </summary>
		public Expression PreCondition { get; set; }

		/// <summary>
		/// Utófeltétel
		/// </summary>
		public Expression PostCondition { get; set; }

		/// <summary>
		/// Maga a főprogram ami köré van építve a validálás
		/// </summary>
		public Expression Body { get; protected set; }

		public override ExpressionType NodeType
		{
			get
			{
				return ExpressionType.Extension;
			}
		}

		public override bool CanReduce
		{
			get
			{
				return true;
			}
		}

		public override Expression Reduce()
		{
			return Body;
		}

		public override Type Type
		{
			get
			{
				return Body.Type;
			}
		}

		protected override Expression VisitChildren(ExpressionVisitor visitor)
		{
			visitor.Visit(PreCondition);
			var ret = visitor.Visit(Body);
			visitor.Visit(PostCondition);
			return ret;
		}

		/// <summary>
		/// Statikus függvény a DebugExpression példányosítására. 
		/// </summary>
		public static DebugExpression MakeDebugExpression(Expression body, Expression preCondition = null, Expression postCondition = null)
		{
			return new DebugExpression() { Body = body, PreCondition = preCondition, PostCondition = postCondition };
		}
	}
}
